package com.zhoukai.config.shiro;

/**
 * @Description TODO
 * @Author Mr.ZHOU
 * @Date Created in 2021/12/15 15:12
 */
import com.zhoukai.constants.Constants;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.util.WebUtils;
import org.springframework.context.annotation.Configuration;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.Serializable;
import java.util.UUID;

@Configuration
public class TokenWebSessionManager extends DefaultWebSessionManager {
    /**
     * 获取SessionId 时，不再去获取前端的JESSIONID 这个值，而是获取你自定义的一个值
     * 当我们使用YAPI 发请求是，是直接通过浏览器发生的请求，我们就能获取到浏览器的sessionId
     * 我们使用Vue 发请求时，是有axios 这个组件发生的请求 ，我们就无法获取到sessionId
     *
     * @param request
     * @param response
     * @return
     */
    @Override
    protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
        // 当我们登陆成功时，我们给前端会给一个token ，前端将该Token 保存起来，以后每次发请求时，都要把Token 带过来
        String token = WebUtils.toHttp(request).getHeader(Constants.TOKEN);

        if (StringUtils.isBlank(token)) { // 前端还没有这个Token ，我们给他生成一个
            // 使用shiro 内置的sessionid 生成策略 ，使用UUID 生成的Token 在很多情况下有问题
            Serializable sessionId = super.getSessionId(request, response);
            if (sessionId == null) {
                token = UUID.randomUUID().toString();
            } else {
                token = sessionId.toString();
            }
        }

        return token;
    }
}
